const DataLookModel = require("../model/DataLookModel.js");

class DataLookController {
    constructor() {
        this.dataLookModel = new DataLookModel();
    }

    /**
     * 1. 获取当日营业额
     */
    async getTodaySales(req, res) {
        try {
            const { date } = req.query; // 支持URL参数传入日期（YYYY-MM-DD）
            const salesData = await this.dataLookModel.getTodaySales(date);

            if (salesData) {
                res.json({
                    code: 0,
                    msg: '当日营业额获取成功',
                    data: salesData
                });
            } else {
                res.json({
                    code: 1,
                    msg: date ? `日期${date}暂无营业额数据` : '今日暂无营业额数据',
                    data: null
                });
            }
        } catch (error) {
            res.status(500).json({
                code: 1,
                msg: '获取当日营业额失败：' + error.message,
                data: null
            });
        }
    }

    /**
     * 2. 获取当日订单数
     */
    async getTodayOrders(req, res) {
        try {
            const { date } = req.query; // 支持URL参数传入日期（YYYY-MM-DD）
            const orderData = await this.dataLookModel.getTodayDiningCount(date);

            res.json({
                code: 0,
                msg: '当日订单数获取成功',
                data: orderData
            });
        } catch (error) {
            res.status(500).json({
                code: 1,
                msg: '获取当日订单数失败：' + error.message,
                data: null
            });
        }
    }

    /**
     * 3. 获取库存预警总数
     */
    async getInventoryWarningCount(req, res) {
        try {
            const { total, list } = await this.dataLookModel.getInventoryWarningCount();

            res.json({
                code: 0,
                msg: '库存预警数据获取成功',
                data: {
                    total,  // 预警总数
                    list    // 可选：返回详情列表
                }
            });
        } catch (error) {
            res.status(500).json({
                code: 1,
                msg: '获取库存预警总数失败：' + error.message,
                data: null
            });
        }
    }

    /**
     * 4. 获取待采购情况
     */
    async getPendingProcurement(req, res) {
        try {
            const pendingData = await this.dataLookModel.getPendingProcurementSummary();

            res.json({
                code: 0,
                msg: '待采购情况获取成功',
                count: pendingData.length, // 待处理采购计划数量
                data: pendingData
            });
        } catch (error) {
            res.status(500).json({
                code: 1,
                msg: '获取待采购情况失败：' + error.message,
                data: null
            });
        }
    }
    /**
     * 5. 获取每日用餐人数趋势（支持?startDate=2025-10-01&endDate=2025-10-14参数）
     */
    async getDiningCountTrend(req, res) {
        try {
            const { startDate, endDate } = req.query; // 从URL参数获取日期区间

            // 调用模型方法查询趋势数据
            const trendData = await this.dataLookModel.getDiningCountTrend(startDate, endDate);

            res.json({
                code: 0,
                msg: '每日用餐人数趋势获取成功',
                data: {
                    startDate: trendData.length > 0 ? trendData[0].date : (startDate || ''),
                    endDate: trendData.length > 0 ? trendData[trendData.length - 1].date : (endDate || ''),
                    list: trendData // 每日数据列表（按日期升序）
                }
            });
        } catch (error) {
            res.status(500).json({
                code: 1,
                msg: '获取每日用餐人数趋势失败：' + error.message,
                data: null
            });
        }
    }

    /**
     * 5. 获取每日用餐人数趋势（ECharts折线图专用）
     * 支持参数：?startDate=2025-10-01&endDate=2025-10-14
     */
    async getDiningCountTrendEcharts(req, res) {
        try {
            const { startDate, endDate } = req.query;
            const echartsData = await this.dataLookModel.getDiningCountTrendEcharts(startDate, endDate);

            res.json({
                code: 0,
                msg: 'ECharts用餐人数趋势数据获取成功',
                data: echartsData
            });
        } catch (error) {
            res.status(500).json({
                code: 1,
                msg: '获取ECharts趋势数据失败：' + error.message,
                data: null
            });
        }
    }

    /**
     * 6. 获取营收趋势（支持?startDate=2025-10-01&endDate=2025-10-07参数，默认最近7天）
     */
    async getRevenueTrend(req, res) {
        try {
            const { startDate, endDate } = req.query;
            const revenueData = await this.dataLookModel.getRevenueTrend(startDate, endDate);

            res.json({
                code: 0,
                msg: '营收趋势数据获取成功',
                data: revenueData
            });
        } catch (error) {
            res.status(500).json({
                code: 1,
                msg: '获取营收趋势数据失败：' + error.message,
                data: null
            });
        }
    }

    /**
     * 7. 采购物品分类统计（返回原始数据和ECharts饼状图数据）
     * 支持参数：?status=3,4,5,6（订单状态，默认统计有效订单：3-已确认/4-配送中/5-部分入库/6-已完成）
     */
    async getPurchaseCategoryStat(req, res) {
        try {
            // 处理请求参数：订单状态筛选（默认有效订单状态）
            const { status, startDate, endDate } = req.query;
            const statusList = status
                ? status.split(',').map(Number).filter(Boolean) // 转换为数字数组并去空
                : [3, 4, 5, 6]; // 默认统计非取消、非作废的有效订单

            // 调用模型方法获取统计数据
            const statData = await this.dataLookModel.getPurchaseCategoryStat(startDate, endDate, statusList);

            res.json({
                code: 0,
                msg: '采购物品分类统计数据获取成功',
                data: {
                    filter: { statusList }, // 返回当前筛选条件，方便前端展示
                    rawList: statData.rawList, // 原始统计数据（含分类ID、金额等）
                    pieChartData: statData.pieChartData // ECharts饼状图数据
                }
            });
        } catch (error) {
            res.status(500).json({
                code: 1,
                msg: '获取采购物品分类统计失败：' + error.message,
                data: null
            });
        }
    }


    /**
     * 8. 采购成本分析（X轴：产品类别，Y轴：采购总金额）
     * 支持参数：
     * - ?status=3,4,5,6（订单状态，默认有效订单）
     * - ?startDate=2025-10-01&endDate=2025-10-31（日期区间，可选）
     */
    async getPurchaseCostAnalysis(req, res) {
        try {
            // 解析请求参数
            const { status, startDate, endDate } = req.query;
            // 处理订单状态（默认有效订单）
            const statusList = status
                ? status.split(',').map(Number).filter(Boolean)
                : [1, 2, 3, 4, 5, 6];

            // 调用模型方法
            const costData = await this.dataLookModel.getPurchaseCostAnalysis(
                statusList,
                startDate,
                endDate
            );

            res.json({
                code: 0,
                msg: '采购成本分析数据获取成功',
                data: costData
            });
        } catch (error) {
            res.status(500).json({
                code: 1,
                msg: '获取采购成本分析失败：' + error.message,
                data: null
            });
        }
    }

    /**
     * 9. 月度经营分析对比（支持指定年份，默认当前年）
     * 支持参数：?year=2025（可选，默认当前年份）
     */
    async getMonthlyBusinessAnalysis(req, res) {
        try {
            const { year } = req.query;
            // 转换年份为数字（默认当前年）
            const targetYear = year ? Number(year) : null;

            const analysisData = await this.dataLookModel.getMonthlyBusinessAnalysis(targetYear);

            res.json({
                code: 0,
                msg: `2025月度经营分析数据获取成功`,
                data: analysisData
            });
        } catch (error) {
            res.status(500).json({
                code: 1,
                msg: '获取月度经营分析失败：' + error.message,
                data: null
            });
        }
    }

    /**
     * 10. 最近活动（返回用户近期操作日志，默认最近7条）
     * 支持参数：
     * - ?startDate=2025-10-20 00:00:00（开始时间，可选）
     * - ?endDate=2025-10-25 23:59:59（结束时间，可选）
     * - ?limit=10（返回条数，可选，默认7）
     */
    async getRecentActivities(req, res) {
        try {
            const { startDate, endDate, limit } = req.query;
            // 处理参数：条数默认7，转换为数字
            const limitNum = limit ? Number(limit) : 7;

            const activities = await this.dataLookModel.getRecentActivities(
                startDate,
                endDate,
                limitNum
            );

            res.json({
                code: 0,
                msg: '最近活动日志获取成功',
                data: activities, // 返回原始日志数据
                count: activities.length // 实际返回条数
            });
        } catch (error) {
            res.status(500).json({
                code: 1,
                msg: '获取最近活动日志失败：' + error.message,
                data: null
            });
        }
    }
}

module.exports = DataLookController;